package com.sisgesbyte.web.managedBean.seguridad;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.localizacion.MantenimientoCiudad;
import com.sisgesbyte.services.localizacion.MantenimientoDivision;
import com.sisgesbyte.services.localizacion.MantenimientoPais;
import com.sisgesbyte.services.localizacion.bean.CiudadBean;
import com.sisgesbyte.services.localizacion.bean.DivisionBean;
import com.sisgesbyte.services.localizacion.bean.ListaCiudadResponse;
import com.sisgesbyte.services.localizacion.bean.ListaDivisionResponse;
import com.sisgesbyte.services.localizacion.bean.ListaPaisesResponse;
import com.sisgesbyte.services.localizacion.bean.PaisBean;
import com.sisgesbyte.services.sistema.MantenimientoAccesoLocalizacion;
import com.sisgesbyte.services.sistema.MantenimientoUsuario;
import com.sisgesbyte.services.sistema.bean.AccesoLocalizacionBean;
import com.sisgesbyte.services.sistema.bean.AccesoLocalizacionListaResponse;
import com.sisgesbyte.services.sistema.bean.UsuarioBean;
import com.sisgesbyte.services.sistema.bean.UsuarioListaResponse;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;

@ManagedBean
@ViewScoped
public class AccesoLocalizacionMBean extends MantenimientoAbstract implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private MantenimientoAccesoLocalizacion mantenimientoAccesoLocalizacion;
	@EJB
	private MantenimientoUsuario mantenimientoUsuario;
	@EJB
	private MantenimientoPais mantenimientoPais;
	@EJB
	private MantenimientoDivision mantenimientoDivision;
	@EJB
	private MantenimientoCiudad mantenimientoCiudad;
	@Inject
	private Validaciones validaciones;
	private List<AccesoLocalizacionBean> listaAccesoLocalizacion;
	private List<AccesoLocalizacionBean> selectedAccesoLocalizacion;
	private List<UsuarioBean> listaUsuarios;
	private List<PaisBean> listaPaises;
	private List<DivisionBean> listaDivision;
	private List<CiudadBean> listaCiudades;
	private String tipoMantenimiento;
	private String saved;
	private String txtBuscar;
	private FiltrosSQLBean cadenaFiltros;
	@ManagedProperty(value="#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	
	@PostConstruct
	private void init(){
		tipoMantenimiento="";
		saved="";
		crearFiltro();
		inicializar();
		cargarUsuarios();
		cargarPaises();
		cargarDivision();
		cargarCiudad();
	}
	
	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public List<AccesoLocalizacionBean> getListaAccesoLocalizacion() {
		return listaAccesoLocalizacion;
	}

	public void setListaAccesoLocalizacion(
			List<AccesoLocalizacionBean> listaAccesoLocalizacion) {
		this.listaAccesoLocalizacion = listaAccesoLocalizacion;
	}

	public List<AccesoLocalizacionBean> getSelectedAccesoLocalizacion() {
		return selectedAccesoLocalizacion;
	}

	public void setSelectedAccesoLocalizacion(
			List<AccesoLocalizacionBean> selectedAccesoLocalizacion) {
		this.selectedAccesoLocalizacion = selectedAccesoLocalizacion;
	}

	public List<UsuarioBean> getListaUsuarios() {
		return listaUsuarios;
	}

	public void setListaUsuarios(List<UsuarioBean> listaUsuarios) {
		this.listaUsuarios = listaUsuarios;
	}

	public List<PaisBean> getListaPaises() {
		return listaPaises;
	}

	public void setListaPaises(List<PaisBean> listaPaises) {
		this.listaPaises = listaPaises;
	}

	public List<DivisionBean> getListaDivision() {
		return listaDivision;
	}

	public void setListaDivision(List<DivisionBean> listaDivision) {
		this.listaDivision = listaDivision;
	}

	public List<CiudadBean> getListaCiudades() {
		return listaCiudades;
	}

	public void setListaCiudades(List<CiudadBean> listaCiudades) {
		this.listaCiudades = listaCiudades;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public FiltrosSQLBean getCadenaFiltros() {
		return cadenaFiltros;
	}

	public void setCadenaFiltros(FiltrosSQLBean cadenaFiltros) {
		this.cadenaFiltros = cadenaFiltros;
	}

	@Override
	public void inicializar() {
		try{
			AccesoLocalizacionListaResponse response =  mantenimientoAccesoLocalizacion.listarAccesoLocalizacion(ObtenerIdTransaccion(),cadenaFiltros);
		
			if(Integer.valueOf(response.getCodigoRespuesta()) >-1){
				this.listaAccesoLocalizacion = response.getListaAccesoLocalizacion();
			}else{
				System.out.println("No se Encontro data " + response.getCodigoRespuesta());
			}
		}catch(Exception e){
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}
	
	public void cargarUsuarios(){
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			filtroSQL.setCampoOrden("us.id");
			filtroSQL.setTipoOrden("desc");
			UsuarioListaResponse response =  mantenimientoUsuario.listarUsuarios(ObtenerIdTransaccion(),filtroSQL);
		
			if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaUsuarios = response.getListaUsuarios();
			}else{
				System.out.println("No se Encontro data " + response.getCodigoRespuesta());
			}
		}catch(Exception e){
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}
	
	public void cargarPaises(){
		try{
			ListaPaisesResponse response =  mantenimientoPais.listarPaises(ObtenerIdTransaccion());
		
			if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaPaises= response.getListaPaises();
			}else{
				System.out.println("No se Encontro data " + response.getCodigoRespuesta());
			}
		}catch(Exception e){
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}
	
	public void cargarDivision(){
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			filtroSQL.setCampoOrden("p.nombre");
			filtroSQL.setTipoOrden("desc");
			
			ListaDivisionResponse response =  mantenimientoDivision.listarDivision(ObtenerIdTransaccion(),filtroSQL);
		
			if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaDivision= response.getListaDivision();
			}else{
				System.out.println("No se Encontro data " + response.getCodigoRespuesta());
			}
		}catch(Exception e){
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}
	
	public void cargarCiudad(){
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			filtroSQL.setCampoOrden("dp.nombre");
			filtroSQL.setTipoOrden("desc");
			
			ListaCiudadResponse  response =  mantenimientoCiudad.listarCiudades(ObtenerIdTransaccion(),filtroSQL);
		
			if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaCiudades= response.getListaCiudades();
			}else{
				System.out.println("No se Encontro data " + response.getCodigoRespuesta());
			}
		}catch(Exception e){
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}

	@Override
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedAccesoLocalizacion.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedAccesoLocalizacion.size());
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedAccesoLocalizacion.size());
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		List<AccesoLocalizacionBean> selected = new ArrayList<AccesoLocalizacionBean>();
		selected.add((AccesoLocalizacionBean) event.getObject());
		setSelectedAccesoLocalizacion(selected);
		setSaved("");
		opcionesControlador.habilitarControles(selectedAccesoLocalizacion.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void nuevoItem() {
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void updateInsertItem() {
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)){
			guardarItem();
		}
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)){
			modificarItem();
		}
	}

	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	@Override
	public void guardarItem() {
		GenericResponse response = null;
		try{
			for( AccesoLocalizacionBean bean: listaSeleccionados(selectedAccesoLocalizacion)){
				response = mantenimientoAccesoLocalizacion.nuevoAccesoLocalizacion(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se registro Correctamente");
				}else{
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un error al Registrar " + response.getCodigoRespuesta() + " - "+ response.getMensajeRespuesta());
				}
			}
			limpiarFormulario();
			inicializar();
		}catch(Exception e){
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void modificarItem() {
		GenericResponse response = null;
		try{
			for( AccesoLocalizacionBean bean: listaSeleccionados(selectedAccesoLocalizacion)){
				response = mantenimientoAccesoLocalizacion.editAccesoLocalizacion(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se Acualizo correctamente");
				}else{
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un Error al Actualizar de BD " + response.getCodigoRespuesta() +" - " +response.getMensajeRespuesta() );
				}
			}
			inicializar();
		}catch(Exception e){
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		GenericResponse response = null;
		try{
			for(AccesoLocalizacionBean bean :selectedAccesoLocalizacion){					
				response = mantenimientoAccesoLocalizacion.deleteAccesoLocalizacion(ObtenerIdTransaccion(), bean.getId());
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					System.out.println("Se elimino Correctamente");
				}else{
					System.out.println("No se pudo Eliminar de BD " + response.getCodigoRespuesta() +" - " + response.getMensajeRespuesta());
				}
			}
			inicializar();
			opcionesControlador.desactivarControles();
		}catch(Exception e){
			System.out.println("Hubo un error al tratar de Eliminar " + e);
		}
	}

	@Override
	public void actualizarEstado() {
		GenericResponse response = null;
		try{
			for(AccesoLocalizacionBean bean :listaSeleccionados(listaAccesoLocalizacion)){
				response = mantenimientoAccesoLocalizacion.editAccesoLocalizacion(ObtenerIdTransaccion(), bean);
				System.out.println(bean.getActive());
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					System.out.println("Se Acualizo correctamente");
				}
			}
			inicializar();
		}catch(Exception e){
			System.out.println("Hubo un error al actualizar el estado " + e);
		}
	}

	/*Metodo para recorrer y validar los tipos de campos seleccionados
	 */
	public List<AccesoLocalizacionBean> listaSeleccionados(List<AccesoLocalizacionBean> listaRequest){
		List<AccesoLocalizacionBean> response = new ArrayList<AccesoLocalizacionBean>();
		for(AccesoLocalizacionBean listaBean : listaRequest){
			AccesoLocalizacionBean bean = new AccesoLocalizacionBean();
			bean.setActive(listaBean.getActive());
			bean.setCiudad(validaciones.validarCamposString(listaBean.getCiudad()));
			bean.setCiudadId(validaciones.validarCampoInteger(listaBean.getCiudadId()));
			bean.setDivision(validaciones.validarCamposString(listaBean.getDivision()));
			bean.setDivisionPaisId(validaciones.validarCampoInteger(listaBean.getDivisionPaisId()));
			bean.setId(validaciones.validarCampoInteger(listaBean.getId()));
			bean.setPais(validaciones.validarCamposString(listaBean.getPais()));
			bean.setPaisId(validaciones.validarCampoInteger(listaBean.getPaisId()));
			bean.setUsuario(validaciones.validarCamposString(listaBean.getUsuario()));
			bean.setUsuarioId(validaciones.validarCampoInteger(listaBean.getUsuarioId()));
			response.add(bean);
		}
		return response;
	}

	@Override
	public void limpiarFormulario() {
		List<AccesoLocalizacionBean> newListaBean = new ArrayList<AccesoLocalizacionBean>(); 
		AccesoLocalizacionBean bean = new AccesoLocalizacionBean();
		bean.setCiudad("");
		newListaBean.add(bean);
		setSelectedAccesoLocalizacion(newListaBean);
	}

	@Override
	public void crearFiltro() {
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		try{
			if(getTxtBuscar() !=null && getTxtBuscar().toString().length() > 0){
				System.out.println("Ingresa");
				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("al.id");
				campo.add("u.usuario");
				campo.add("p.nombre");
				campo.add("c.nombre");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("like");
				filtro.add(listaCampo);
				filtroSQL.setListaFiltros(filtro);
				valores.add("%"+getTxtBuscar() + "%");
				filtroSQL.setListaValores(valores);
				
			}else{
				filtroSQL.setCampoOrden("al.id");
				filtroSQL.setTipoOrden("desc");
			}
			setCadenaFiltros(filtroSQL);
			inicializar();
			opcionesControlador.habilitarControles(0);
		}catch(Exception e){
			System.out.println("Error al crear filtro " + e);
			filtroSQL.setCampoOrden("al.id");
			filtroSQL.setTipoOrden("desc");
		}
	}
}
